package com.xbongbong.sso.service.imp;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.util.DateTimeUtil;
import com.xbongbong.sso.domain.entity.OauthStepEntity;
import com.xbongbong.sso.enums.StepTypeEnum;
import com.xbongbong.sso.help.OauthStepHelp;
import com.xbongbong.sso.model.OauthStepModel;
import com.xbongbong.sso.pojo.OauthStepPojo;
import com.xbongbong.sso.pojo.dto.OauthStepAddDTO;
import com.xbongbong.sso.pojo.dto.OauthStepDetailDTO;
import com.xbongbong.sso.pojo.dto.OauthStepListDTO;
import com.xbongbong.sso.pojo.dto.OauthStepUpdateDTO;
import com.xbongbong.sso.pojo.vo.OauthStepAddVO;
import com.xbongbong.sso.pojo.vo.OauthStepDetailVO;
import com.xbongbong.sso.pojo.vo.OauthStepListVO;
import com.xbongbong.sso.pojo.vo.OauthStepUpdateVO;
import com.xbongbong.sso.service.OauthStepService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 授权步骤
 */
@Service("oauthStepService")
public class OauthStepServiceImpl implements OauthStepService {
    private static final Logger LOG = LoggerFactory.getLogger(OauthStepServiceImpl.class);

    @Resource
    private OauthStepModel oauthStepModel;
    @Resource
    private OauthStepHelp oauthStepHelp;

    @Override
    public OauthStepListVO list(OauthStepListDTO oauthStepListDTO) throws XbbException {
        String corpid = oauthStepListDTO.getCorpid();
        Long connectorId = oauthStepListDTO.getConnectorId();
        Map<String, Object> param = new HashMap<>();
        param.put("corpid", corpid);
        param.put("connectorId", connectorId);
        param.put("del", 0);
        List<OauthStepEntity> oauthSteps = oauthStepModel.findEntities(param);
        Map<Integer, OauthStepEntity> oauthStepMap = new HashMap<>();
        for (OauthStepEntity oauthStep : oauthSteps) {
            oauthStepMap.put(oauthStep.getStepType(), oauthStep);
        }
        List<OauthStepPojo> list = new ArrayList<>();
        List<StepTypeEnum> stepTypeEnums = StepTypeEnum.getAll();
        for(StepTypeEnum stepTypeEnum : stepTypeEnums) {
            Integer code = stepTypeEnum.getCode();
            String name = stepTypeEnum.getName();
            OauthStepEntity oauthStep = oauthStepMap.get(code);
            OauthStepPojo oauthStepPojo = oauthStepHelp.oauthStepPojoFormat(oauthStep);
            JSONObject stepTypeJson = new JSONObject();
            stepTypeJson.put("value", code);
            stepTypeJson.put("text", name);
            oauthStepPojo.setStepType(stepTypeJson);
            list.add(oauthStepPojo);
        }
        OauthStepListVO oauthStepListVO = new OauthStepListVO();
        oauthStepListVO.setList(list);
        return oauthStepListVO;
    }

    @Override
    public OauthStepDetailVO detail(OauthStepDetailDTO oauthStepDetailDTO) throws XbbException {
        String corpid = oauthStepDetailDTO.getCorpid();
        Long id = oauthStepDetailDTO.getId();
        OauthStepEntity oauthStep = oauthStepModel.getByKey(id, corpid);
        OauthStepPojo oauthStepPojo = oauthStepHelp.oauthStepPojoFormat(oauthStep);
        OauthStepDetailVO oauthStepDetailVO = new OauthStepDetailVO();
        oauthStepDetailVO.setOauthStep(oauthStepPojo);
        return oauthStepDetailVO;
    }

    @Override
    public OauthStepAddVO add(OauthStepAddDTO oauthStepAddDTO) throws XbbException {
        String corpid = oauthStepAddDTO.getCorpid();
        Long connectorId = oauthStepAddDTO.getConnectorId();
        Integer stepType = oauthStepAddDTO.getStepType();
        String url = oauthStepAddDTO.getUrl();
        Integer method = oauthStepAddDTO.getMethod();
        Integer contentType = oauthStepAddDTO.getContentType();
        Integer enable = oauthStepAddDTO.getEnable();

        OauthStepEntity oauthStep = new OauthStepEntity();
        oauthStep.setCorpid(corpid);
        oauthStep.setConnectorId(connectorId);
        oauthStep.setEnable(enable);
        oauthStep.setStepType(stepType);
        oauthStep.setUrl(url);
        oauthStep.setMethod(method);
        oauthStep.setContentType(contentType);
        oauthStepModel.insert(oauthStep);
        OauthStepAddVO oauthStepAddVO = new OauthStepAddVO();
        oauthStepAddVO.setDataId(oauthStep.getId());
        return oauthStepAddVO;
    }

    @Override
    public OauthStepUpdateVO update(OauthStepUpdateDTO oauthStepUpdateDTO) throws XbbException {
        Long id = oauthStepUpdateDTO.getId();
        String corpid = oauthStepUpdateDTO.getCorpid();
        Integer enable = oauthStepUpdateDTO.getEnable();
        Integer stepType = oauthStepUpdateDTO.getStepType();
        String url = oauthStepUpdateDTO.getUrl();
        Integer method = oauthStepUpdateDTO.getMethod();
        Integer contentType = oauthStepUpdateDTO.getContentType();

        OauthStepEntity oauthStep = new OauthStepEntity();
        oauthStep.setId(id);
        oauthStep.setCorpid(corpid);
        oauthStep.setEnable(enable);
        oauthStep.setStepType(stepType);
        oauthStep.setUrl(url);
        oauthStep.setMethod(method);
        oauthStep.setContentType(contentType);
        oauthStep.setUpdateTime(DateTimeUtil.getInt());
        oauthStepModel.update(oauthStep);
        OauthStepUpdateVO oauthStepUpdateVO = new OauthStepUpdateVO();
        oauthStepUpdateVO.setDataId(oauthStep.getId());
        return oauthStepUpdateVO;
    }
}
